// 动态数组存储结构的字符串操作

// 初始化操作
typedef struct{
	char *str;
	int maxLength;
	int length;
	
}DString;
void Initiate(DString *S, int max, char *string) {
    int i, m;
    S->length = strlen(string);
    if(S->length > max) m = S->length;
    else m = max;
    S->maxLength = m;
    S->str = (char *)malloc(sizeof(char)*m);
    for(i = 0; i < S->length; i++)
        S->str[i] = string[i];
}

// 插入子串操作
int Insert(DString *S, int pos, DString T) {
    //在主串 S 的 pos 位置插入子串 T，插入成功则返回 1，失败则返回 0
    int i;
    if (pos < 0) {
        printf("参数 pos 出错!");
        return 0;
    }
    else {
        if(S->length + T.length > S->maxLength){
            //重新申请S->str所指数组空间，原数组元素存放在新数组的前面
            realloc(S->str, (S->length+T.length)*sizeof(char));
            S->maxLength = S->length+T.length;
        }
        
        for(i = S->length-1; i >= pos; i--)
            S->str[i+T.length] = S->str[i]; //依次后移T.length个位置
        for(i = 0; i < T.length; i++)
            S->str[pos+i] = T.str[i]; //插入
        S->length += T.length; //置新的元素个数
        return 1;
    }
}

// 删除子串操作
int Delete(DString *S, int pos, int len){
    //删除主串 S 从 pos 位置开始的长度为 len 的子串，删除成功则返回 1，失败则返回 0
    int i;
    if(S->length <= 0){
        printf("数组中未存放字符无元素可删！\n");
        return 0;
    }
    else if(pos < 0 || len < 0 || pos+len > S->length){
        printf("参数 pos 和 len 不合法");
        return 0;
    }
    else {
        for(i = pos+len; i <= S->length-1; i++)
            S->str[i-len] = S->str[i];
        S->length = S->length - len;
        return 1;
    }
}

// 取子串操作
int SubString(DString *S, int pos, int len, DString *T) {
    //取主串 S 从 pos 位置开始的长度为 len 的子串，取成功则返回 1，失败则返回 0
    int i;
    if (pos < 0 || len < 0 || pos+len > S->length) {
        printf("参数 pos 和 len 出错!");
        return 0;
    }
    
    if(len > T->maxLength) {
        T->str = (char *)malloc(len*sizeof(char)); //重新申请数组空间
        T->maxLength = len;
    }
    
    for(i = 0; i < len; i++)
        T->str[i] = S->str[pos+i];
    T->length = len;
    return 1;
}

// 撤销操作
void Destroy(DString *S) {
    //撤销串 S 占用的内存空间
    free(S->str);
    S->maxLength = 0;
    S->length = 0;
}